﻿using System;
using System.ComponentModel;

namespace MaxStoreErp.Core.BaseClasses
{
    /// <summary>
    /// Базовый класс для всех сущностей
    /// </summary>
    public abstract class EntityBase : INotifyPropertyChanged
    {
        bool _isDeleted;

        protected EntityBase()
        {
            Id = -1;
        }

        /// <summary>
        /// Идентификатор записи в базе данных
        /// </summary>
        public int Id { get; set; }

        /// <summary>
        /// Определяет, является ли запись новой
        /// </summary>
        /// <returns>возвращает <c>true</c> - если запись является новой</returns>
        public bool IsNew()
        {
            return Id == -1;
        }

        /// <summary>
        /// Дата/время последнего обновления
        /// </summary>
        public DateTime LastUpdate { get; set; }

        /// <summary>
        /// Флаг удаленной записи
        /// </summary>
        public bool IsDeleted
        {
            get { return _isDeleted; }
            set { OnPropertyChanged(ref _isDeleted, value, "IsDeleted"); }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        protected bool OnPropertyChanged<TField>(ref TField field, TField value, string propertyName)
        {
            if (Equals(field, value))
                return false;

            field = value;

            OnPropertyChanged(propertyName);
            return true;
        }

        protected bool OnPropertyChanged<TField>(ref TField field, TField value, Action onChanged, string propertyName)
        {
            if (OnPropertyChanged(ref field, value, propertyName))
            {
                var evt = onChanged;
                if (evt != null)
                {
                    evt();
                }
                return true;
            }
            return false;
        }
    }

}
